# 题目：用两个栈实现队列，队列的声明如下，实现他的两个函数appendTail和DeleteHead,分别而完成在队列尾部插入节点和在队列头部删除节点的功能。

from provate import Stack
import typing


# 队列与栈的区别是：队列是“先进先出”，而栈是“先进后出”
# 主要思想，使用两个栈stack1, 和stack2，如要加入元素，则压如stack1中，当需要弹出时，将stack1中的元素一一弹出并压入stack2 中，这时顺序反序，stack2中栈顶的元素
# 则刚好为先进入stack1 中元素，这时候若要再压入元素，则继续加入stack1 中，弹出元素则将stack2 中栈顶元素弹出，直到stack2里没有元素，再把stack1中的元素压入stack2 中


class c_queue:
    def __init__(self):
        self._stack1 = Stack()
        self._stack2 = Stack()

    def append_tail(self, val):
        self._stack1.push(val)

    def template(self):
        if self._stack2.isNone() and self._stack1.isNone():
            raise Exception('queue is empty')

        if self._stack2.isNone():
            while not self._stack1.isNone():
                tmp = self._stack1.popout()
                self._stack2.push(tmp)

        return self._stack2.popout()

    def isEmpty(self):
        return self._stack2.isNone() and self._stack1.isNone()


if __name__ == '__main__':
    # 测试1 往空的对列中添加元素、删除元素
    q = c_queue()
    q.append_tail(1)
    q.append_tail(2)
    q.append_tail(3)
    print('test 1 :', q.template())

    # 测试2 往非空的队列中添加、删除元素
    q.append_tail(4)
    print('test 2 :', q.template())

    # 测试3 一直删除元素至空
    while not q.isEmpty():
        print('test 3 :', q.template())
